//package io.github.wppli.webcocket;
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.security.core.Authentication;
//import org.springframework.stereotype.Component;
//
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Objects;
//import java.util.concurrent.CopyOnWriteArraySet;
//import java.util.concurrent.atomic.AtomicInteger;
//
//// 前端链接的路由（ws://localhost:8080/webSocket/projectHome）
//@ServerEndpoint(value = "/webSocket/projectHome", subprotocols = "")
//@Slf4j
//@Component
//public class WebSocketServer {
//
//
//    /**
//     * concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。
//     */
//    private static final CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
//
//
//    /**
//     * 连接数
//     */
//    private static final AtomicInteger count = new AtomicInteger();
//
//    /**
//     * 用户id，一开始使用前端传入的方式，但是有安全隐患，后来换成后端从security中获取
//     */
//    private String userId = "";
//
//    /**
//     * 连接建立成功调用的方法
//     */
//    @OnOpen
//    public void onOpen(Session session) {
//        // 获取用户信息，保存到websocket中
//        Authentication authentication = (Authentication) session.getUserPrincipal();
//        SecurityUtils.setAuthentication(authentication);
//        String username = SecurityUtils.getUsername();
//        this.session = session;
//        //如果存在就先删除一个，防止重复推送消息
//        for (WebSocketServer webSocket : webSocketSet) {
//            if (webSocket.userId.equals(username)) {
//                webSocketSet.remove(webSocket);
//                count.getAndDecrement();
//            }
//        }
//        count.getAndIncrement();
//        webSocketSet.add(this);
//        this.userId = username;
//    }
//
//    /**
//     * 连接关闭调用的方法
//     */
//    @OnClose
//    public void onClose() {
//        webSocketSet.remove(this);
//        count.getAndDecrement();
//    }
//
//    /**
//     * 收到客户端消息后调用的方法
//     *
//     * @param message 客户端发送过来的消息
//     */
//    @OnMessage
//    public void onMessage(String message, Session session) {
//        Authentication authentication = (Authentication) session.getUserPrincipal();
//        log.info("收到来自" + userId + "的信息:" + message);
//        // 实时更新
//        service.refresh(userId, authentication);
//    }
//
//    @OnError
//    public void onError(Session session, Throwable error) {
//        log.error("发生错误");
//        error.printStackTrace();
//    }
//
//    /**
//     * 实现服务器主动推送
//     */
//    private void sendMessage(String type, Object data) throws IOException {
//        Map<String, Object> result = new HashMap<>();
//        result.put("type", type);
//        result.put("data", data);
//        this.session.getAsyncRemote().sendText(ObjectMapperBuilder.toJSONString(result));
//    }
//
//    /**
//     * 群发自定义消息
//     */
//    public static void sendInfo(String type, Object data, @PathParam("sid") String sid) {
//        for (WebSocketServer item : webSocketSet) {
//            try {
//                //这里可以设定只推送给这个sid的，为null则全部推送
//                if (sid == null) {
//                    item.sendMessage(type, data);
//                } else if (item.sid.equals(sid)) {
//                    item.sendMessage(type, data);
//                }
//            } catch (IOException ignored) {
//            }
//        }
//    }
//
//    @Override
//    public boolean equals(Object o) {
//        if (this == o) {
//            return true;
//        }
//        if (o == null || getClass() != o.getClass()) {
//            return false;
//        }
//        WebSocketServer that = (WebSocketServer) o;
//        return Objects.equals(session, that.session);
//    }
//
//    /**
//     * 判断是否有链接
//     *
//     * @return
//     */
//    public static boolean isConn(String sid) {
//        for (WebSocketServer item : webSocketSet) {
//            if (item.sid.equals(sid)) {
//                return true;
//            }
//        }
//        return false;
//    }
//
//    @Override
//    public int hashCode() {
//        return Objects.hash(session);
//    }
//
//    @Autowired
//    public void setRepository(StatisticsDataService service) {
//        WebSocketServer.service = service;
//    }
//
//    /**
//     * 实时更新
//     */
//    private void refresh(String userId, Authentication authentication) {
//        ThreadPoolExecutorUtil.getPoll().execute(() -> {
//            // 注入用户信息
//            SecurityUtils.setAuthentication(authentication);
//
//            // 获取元数据
//            int num = 0;
//
//            // 判断用户是否在线，不在线则不用处理
//            while (WebSocketServer.isConn(userId)) {
//                // 获取数据
//                int newNum = 1;
//                // 判断数据是否有更新
//                if (num != newNum) {
//                    num = newNum;
//                    // 发送最新数据给前端
//                    WebSocketServer.sendInfo("num", newNum, userId);
//                }
//                try {
//                    // 没5秒执行一次
//                    Thread.sleep(5000L);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
//        });
//    }
//
//}
